iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0

上一篇的最後,我們透過修改[R|t]裡面的值可以觀察其變化,然而我並沒有教你怎麼修改。
這邊就讓我來說說幾個簡單的旋轉矩陣的表示方法。

在三維座標軸的旋轉中,可以將旋轉分解成分別對X軸、Y軸與Z軸做旋轉。假設對X、Y、Z的旋轉角度分別是Θx、Θy、Θz。其旋轉矩陣可以表示為下:
https://ithelp.ithome.com.tw/upload/images/20190920/201211272myjHcX9bD.png

	cv::Mat rotation_x = (cv::Mat_<double>(3, 3) << 1, 0, 0,
													0, cos(AngleX * CV_PI / 180), -sin(AngleX * CV_PI / 180),
													0, sin(AngleX * CV_PI / 180), cos(AngleX * CV_PI / 180));

https://ithelp.ithome.com.tw/upload/images/20190920/2012112781TbaKpta8.png

	cv::Mat rotation_y = (cv::Mat_<double>(3, 3) << cos(AngleY * CV_PI / 180), 0, sin(AngleY * CV_PI / 180),
													0, 1, 0,
													-sin(AngleY * CV_PI / 180), 0, cos(AngleY * CV_PI / 180));

https://ithelp.ithome.com.tw/upload/images/20190920/201211274xC7bhuT0O.png

	cv::Mat rotation_z = (cv::Mat_<double>(3, 3) << cos(AngleZ* CV_PI/180), -sin(AngleZ * CV_PI / 180), 0,
													sin(AngleZ * CV_PI / 180), cos(AngleZ * CV_PI / 180), 0,
													0, 0, 1);

而有了這三個分別對三個軸的旋轉我們就可以透過矩陣的乘法得到最後的旋轉矩陣,而在https://chart.googleapis.com/chart?cht=tx&amp;chl=R%3DRy()*Rx()*Rz()
的前提下我們可以組合出我們的旋轉矩陣以下列程式表示,並透過修改點的位置來簡單驗證我們的旋轉是否合理。
(注:這裡組合的順序會影響最後旋轉矩陣的結果,矩陣乘法沒有交換律)

#include<opencv2/core/core.hpp>
#include <opencv2/core/types.hpp>
#include <math.h>
#include<iostream>

int main() {
	cv::Point3d pointA =  cv::Point3d(0, 0, 1);

	double AngleX=0, AngleY=90, AngleZ=0;

	cv::Mat rotation_x = (cv::Mat_<double>(3, 3) << 1, 0, 0,
													0, cos(AngleX * CV_PI / 180), -sin(AngleX * CV_PI / 180),
													0, sin(AngleX * CV_PI / 180), cos(AngleX * CV_PI / 180));

	
	cv::Mat rotation_y = (cv::Mat_<double>(3, 3) << cos(AngleY * CV_PI / 180), 0, sin(AngleY * CV_PI / 180),
													0, 1, 0,
													-sin(AngleY * CV_PI / 180), 0, cos(AngleY * CV_PI / 180));
	
	cv::Mat rotation_z = (cv::Mat_<double>(3, 3) << cos(AngleZ* CV_PI/180), -sin(AngleZ * CV_PI / 180), 0,
													sin(AngleZ * CV_PI / 180), cos(AngleZ * CV_PI / 180), 0,
													0, 0, 1);

	cv::Mat result = rotation_y * rotation_x * rotation_z;
	std::cout << "result1/n" << result << std::endl;

	cv::Mat cameraMatrix_out= cv::Mat::eye(3, 4, CV_64FC1);
	result.copyTo(cameraMatrix_out.rowRange(0, 3).colRange(0, 3));

	std::cout << "cameraMatrix_out/n" << cameraMatrix_out << std::endl;


	cv::Mat space_place = cameraMatrix_out*(cv::Mat_<double>(4, 1) << pointA.x, pointA.y, pointA.z, 1);

	std::cout << space_place<<std::endl;
	return 0;
}

下一篇我想嘗試整理旋轉向量的表示法.........並帶入opencv::Rodrigues()


上一篇
day3-pinhole camera model 針孔成像原理
下一篇
day5-旋轉向量
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言